// let name:string;

// function sun(a:number, b:number):number{
//     return a + b
// }

// let num = sun(1,2)

// let age;


// let num1: number[] = [] //
// let num2: Array<number>

// num1 = [1,2,3]
// num2 = [2.3,4]


// let nul:null = null
// let n:string = nul
// n.toLocaleLowerCase()


// 联合类型
let name: string | undefined;
// if(typeof name === 'string'){
//     // 类型会确定为 string，
// }


// void 类型 无返回值
// function vv(): void {
//     console.log('void')
// }

// function fun(): never {
//     while (true) { }
// }

// function fun2(): never {
//     throw new Error('抛出')
// }


// 字面量类型

// let a: "A" = "A" // 只能赋值为字符串A
// let b: 1 = 1

// let gender: '男' | '女'; // 只能赋值为 '男' 或 '女'

// let arr:[];  // 字面量约束，约束为一个空数组

// let user:{
//     name:string
//     age:number
// } // 约束对象 必须有 字符串name属性 数字类型age属性


// 元组

// let tu: [string, number]; // 约束一个数组长度为2 第一项为字符串类型 第二项为number类型
// let tu2: [string|number, number];
// tu2 = ['2', 2]

// let dat:any = 'ggj'
// let n:number = dat
// type sex = '男' | '女'
// type user = {
//     name: string
//     age: number
//     sex: sex
// }

// let u:user;
// function getUser():user{
//     return {name:'12', age:13, sex: '女'}
// }
// u = getUser()

// 函数重载

// /**
//  * 得到a*b的结果
//  * @param a 
//  * @param b 
//  */
// function combine(a: number, b: number): number;
// /**
//  * 得到a+b的结果
//  * @param a 
//  * @param b 
//  */
// function combine(a: string, b: string): string;
// // 保证2个参数类型一致
// function combine(a: number | string, b: number | string): number | string {
//     if(typeof a === 'number' && typeof b === 'number'){
//         return a * b
//     }else if(typeof a === 'string' && typeof b === 'string'){
//         return a + b
//     }
// }
// // combine(1,'d')


function sum(a: number, b: number, c?: number, d: number = 10): number {
    let result = a + b
    if (c !== undefined) {
        result += c
    }
    return result
}
sum(1, 2)
sum(1, 2, 3)


